/**
 * @description 通过枚举对象获取options数据
 * @param {*} enumData 枚举对象
 * @param {*} isNumberKey 枚举对是否采用数字类型作为key
 * @param {*} fieldOrder key的顺序，根据数组中的顺序进行组装
 * @returns select组件所需选项
 */
export const getOptionsByEnum = <T extends object>(
  enumData: T,
  isNumberKey = false,
  fieldOrder?: Array<keyof T>
) => {
  const options: Array<{
    label: T[keyof T]
    value: keyof T
  }> = []
  if (fieldOrder) {
    for (const key of fieldOrder) {
      options.push({
        value: key,
        label: enumData[key]
      })
    }
  } else {
    for (const key in enumData) {
      const value = isNumberKey ? (Number(key) as keyof T) : key
      options.push({
        value,
        label: enumData[key]
      })
    }
  }

  return options
}

/**
 * @description 检测数据是否全等，主要用于枚举类型取值检测，防止枚举数据发生变化，检测值没有ts类型报错提示
 * @param {*} sourceValue 来源数据
 * @param {*} targetValue 目标数据
 * @returns 返回boolean
 */
export const isEqual = <T, T1 extends T>(sourceValue: T, targetValue: T1) =>
  sourceValue === targetValue

/**
 * @description 设置对象属性的值，用于ts类型检测
 * @param object 需要设置值的目标对象
 * @param property 需要设置值的字段
 * @param value 需要设置的值
 */
export const setValue = <O extends object, P extends keyof O>(
  object: O,
  property: P,
  value: O[P]
) => {
  object[property] = value
}
